/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Modelo;

import Beans.BeanProducto;
import java.io.Serializable;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import javax.faces.model.SelectItem;


public class Producto implements Serializable {
    private String codigoProducto;
    private String nombreProducto;
    private String descripcionProducto;
    private double precioSolesProducto;
    private double precioDolaresProducto;
    private int stockProducto;
    private int nuevoStockProducto;
    private String motivoProducto;
    private String estadoProducto;
    private TipoProducto objTipoProducto=new TipoProducto();
    private boolean retorno;

    public Producto() {
    }

    public String getCodigoProducto() {
        return codigoProducto;
    }

    public void setCodigoProducto(String codigoProducto) {
        this.codigoProducto = codigoProducto;
    }

    public String getNombreProducto() {
        return nombreProducto;
    }

    public void setNombreProducto(String nombreProducto) {
        this.nombreProducto = nombreProducto;
    }

    public String getDescripcionProducto() {
        return descripcionProducto;
    }

    public void setDescripcionProducto(String descripcionProducto) {
        this.descripcionProducto = descripcionProducto;
    }

    public double getPrecioSolesProducto() {
        return precioSolesProducto;
    }

    public void setPrecioSolesProducto(double precioSolesProducto) {
        this.precioSolesProducto = precioSolesProducto;
    }

    public double getPrecioDolaresProducto() {
        return precioDolaresProducto;
    }

    public void setPrecioDolaresProducto(double precioDolaresProducto) {
        this.precioDolaresProducto = precioDolaresProducto;
    }

    public int getStockProducto() {
        return stockProducto;
    }

    public void setStockProducto(int stockProducto) {
        this.stockProducto = stockProducto;
    }

    public String getMotivoProducto() {
        return motivoProducto;
    }

    public void setMotivoProducto(String motivoProducto) {
        this.motivoProducto = motivoProducto;
    }

    public String getEstadoProducto() {
        return estadoProducto;
    }

    public void setEstadoProducto(String estadoProducto) {
        this.estadoProducto = estadoProducto;
    }

    public TipoProducto getObjTipoProducto() {
        return objTipoProducto;
    }

    public void setObjTipoProducto(TipoProducto objTipoProducto) {
        this.objTipoProducto = objTipoProducto;
    }

    public boolean isRetorno() {
        return retorno;
    }

    public void setRetorno(boolean retorno) {
        this.retorno = retorno;
    }

    public int getNuevoStockProducto() {
        return nuevoStockProducto;
    }

    public void setNuevoStockProducto(int nuevoStockProducto) {
        this.nuevoStockProducto = nuevoStockProducto;
    }
    
    //registrar
     public static boolean registrarProducto (Producto a)
    {
        boolean estado = false ;
        Connection conexion=null;
         try{
             conexion=ControladorBD.darConexionBD();
             CallableStatement st=conexion.prepareCall(" {call sp_registrarProducto "
                     +"(?,?,?,?,?,?,?)} ");
             st.setString(1,a.getNombreProducto());
             st.setString(2,a.getDescripcionProducto());
             st.setDouble(3,a.getPrecioSolesProducto());
             st.setInt(4,a.getStockProducto());
             st.setString(5,a.getMotivoProducto());  
             st.setString(6,a.getObjTipoProducto().getCodigoTipo());  
             st.registerOutParameter(7,java.sql.Types.BOOLEAN);
             st.execute();
             a.setRetorno(st.getBoolean(7));
             if(a.isRetorno()==true)
             {
                 estado=true;
             }
        st.close();
        conexion.close();
             
         } catch(Exception error){
             System.out.println("Error en el metodo por: "+ error.getMessage());
                                 error.printStackTrace();
         }
         
        return estado;  
        
    } 
    //listar producto
     public static ArrayList<Producto>
            getListarProducto(){
        ArrayList<Producto> arreglo=null;
        Producto obj=null;
        Connection conexion=null;
        ResultSet rs=null;
        
         try{
             conexion=ControladorBD.darConexionBD();
             CallableStatement st=conexion.prepareCall("{call sp_listarProducto()}");
            rs=st.executeQuery();
            if(rs.next()){
                arreglo=new ArrayList<Producto>();
                do{
                obj= new Producto();
                obj.setCodigoProducto(rs.getString("codigoProducto"));
                obj.setNombreProducto(rs.getString("nombreProducto"));
                obj.setDescripcionProducto(rs.getString("descripcionProducto"));
                obj.setPrecioSolesProducto(rs.getDouble("precioSolesProducto"));
                obj.setPrecioDolaresProducto(rs.getDouble("precioDolaresProducto"));
                obj.setStockProducto(rs.getInt("stockProducto"));
                obj.setMotivoProducto(rs.getString("motivoProducto"));
                obj.setEstadoProducto(rs.getString("estadoProducto"));
                obj.getObjTipoProducto().setCodigoTipo(rs.getString("codigoTipo"));
                obj.getObjTipoProducto().setNombreTipo(rs.getString("nombreTipo"));
                obj.getObjTipoProducto().getObjCategoria().setNombreCategoria(rs.getString("nombreCategoria"));
       
                arreglo.add(obj);
                
                }while (rs.next());
            }
        rs.close();
        st.close();
        conexion.close();
             
         }
         catch(Exception error){
             System.out.println("Error en el metodo por: "+ error.getMessage());
                                 error.printStackTrace();
    
}
    return arreglo;
     }
     
     /**
      * buscar persona por parametros
      */
     public static ArrayList<Producto> getBuscarProductoParametro(Producto producto){
     ArrayList<Producto> arreglo=null;
     ResultSet rs=null;
        Producto obj=null;
        Connection conexion = null;
        try{
           conexion = ControladorBD.darConexionBD();
           conexion.setAutoCommit(false);
           conexion = ControladorBD.darConexionBD();
            CallableStatement st = conexion.prepareCall( "{call sp_buscarProductoParametro(?,?,?)}");
            st.setString(1, producto.getNombreProducto());
            st.setString(2, producto.getMotivoProducto());
            st.setString(3, producto.getObjTipoProducto().getCodigoTipo());
            rs = st.executeQuery();
            if (rs.next()){
               arreglo=new ArrayList<Producto>();   
                do{
                        obj =new Producto();
                        obj.setCodigoProducto(rs.getString("codigoProducto"));
                        obj.setNombreProducto(rs.getString("nombreProducto"));
                        obj.setDescripcionProducto(rs.getString("descripcionProducto"));
                        obj.setPrecioSolesProducto(rs.getDouble("precioSolesProducto"));
                        obj.setPrecioDolaresProducto(rs.getDouble("precioDolaresProducto"));
                        obj.setStockProducto(rs.getInt("stockProducto"));
                        obj.setMotivoProducto(rs.getString("motivoProducto"));
                        obj.setEstadoProducto(rs.getString("estadoProducto"));
                        obj.getObjTipoProducto().setCodigoTipo(rs.getString("codigoTipo"));
                        obj.getObjTipoProducto().setNombreTipo(rs.getString("nombreTipo"));
                        obj.getObjTipoProducto().getObjCategoria().setNombreCategoria(rs.getString("nombreCategoria"));
                        arreglo.add(obj);
                }while (rs.next());
            }
            st.close();
            conexion.setAutoCommit(true);
            conexion.close();
        }catch(Exception error){
            System.out.println("Error en el metodo por: " + error.getMessage());
            error.printStackTrace();
        }
        return arreglo;

    }
     
      //listar los productos por tipo de producto
     public static ArrayList<Producto>
            getListarProductoxTipoProducto(String nombreTipo){
        ArrayList<Producto> arreglo=null;
        Producto obj=null;
        Connection conexion=null;
        ResultSet rs=null;
        
         try{
             conexion=ControladorBD.darConexionBD();
             CallableStatement st=conexion.prepareCall("{CALL sp_listarProductoxTipo(?)}");
             st.setString(1,nombreTipo);
            rs=st.executeQuery();
            if(rs.next()){
                arreglo=new ArrayList<Producto>();
                do{
                obj= new Producto();
                obj.setCodigoProducto(rs.getString("codigoProducto"));
                obj.setNombreProducto(rs.getString("nombreProducto"));
                obj.setDescripcionProducto(rs.getString("descripcionProducto"));
                obj.setPrecioSolesProducto(rs.getDouble("precioSolesProducto"));
                obj.setPrecioDolaresProducto(rs.getDouble("precioDolaresProducto"));
                obj.setStockProducto(rs.getInt("stockProducto"));
                obj.setMotivoProducto(rs.getString("motivoProducto"));
                obj.getObjTipoProducto().setNombreTipo(rs.getString("nombreTipo"));
                obj.getObjTipoProducto().getObjCategoria().setNombreCategoria(rs.getString("nombreCategoria"));
       
                arreglo.add(obj);
                
                }while (rs.next());
            }
        rs.close();
        st.close();
        conexion.close();
             
         }
         catch(Exception error){
             System.out.println("Error en el metodo por: "+ error.getMessage());
                                 error.printStackTrace();
    
}
    return arreglo;
     }
     
     
     //listar producto especifico por nombre de producto
     public static ArrayList<Producto>
            getListarProductoEspecifico(Producto a){
        ArrayList<Producto> arreglo=null;
        Producto obj=null;
        Connection conexion=null;
        ResultSet rs=null;
        
         try{
             conexion=ControladorBD.darConexionBD();
             CallableStatement st=conexion.prepareCall("{call sp_listarProductoEspecifico(?)}");
             st.setString(1, a.getNombreProducto());
            rs=st.executeQuery();
            if(rs.next()){
                arreglo=new ArrayList<Producto>();
                do{
                obj= new Producto();
                obj.setCodigoProducto(rs.getString("codigoProducto"));
                obj.setNombreProducto(rs.getString("nombreProducto"));
                obj.setDescripcionProducto(rs.getString("descripcionProducto"));
                obj.setPrecioSolesProducto(rs.getDouble("precioSolesProducto"));
                obj.setPrecioDolaresProducto(rs.getDouble("precioDolaresProducto"));
                obj.setStockProducto(rs.getInt("stockProducto"));
                obj.setMotivoProducto(rs.getString("motivoProducto"));
                obj.setEstadoProducto(rs.getString("estadoProducto"));
                obj.getObjTipoProducto().setNombreTipo(rs.getString("nombreTipo"));
                obj.getObjTipoProducto().getObjCategoria().setNombreCategoria(rs.getString("nombreCategoria"));
       
                arreglo.add(obj);
                
                }while (rs.next());
            }
        rs.close();
        st.close();
        conexion.close();
             
         }
         catch(Exception error){
             System.out.println("Error en el metodo por: "+ error.getMessage());
                                 error.printStackTrace();
    
}
    return arreglo;
     }
     
     //listar productos activos
     public static ArrayList<Producto>
            getListarProductoActivo(){
        ArrayList<Producto> arreglo=null;
        Producto obj=null;
        Connection conexion=null;
        ResultSet rs=null;
        
         try{
             conexion=ControladorBD.darConexionBD();
             CallableStatement st=conexion.prepareCall("{call sp_listarProductoActivo()}");
            rs=st.executeQuery();
            if(rs.next()){
                arreglo=new ArrayList<Producto>();
                do{
                obj= new Producto();
                obj.setCodigoProducto(rs.getString("codigoProducto"));
                obj.setNombreProducto(rs.getString("nombreProducto"));
                obj.setDescripcionProducto(rs.getString("descripcionProducto"));
                obj.setPrecioSolesProducto(rs.getDouble("precioSolesProducto"));
                obj.setPrecioDolaresProducto(rs.getDouble("precioDolaresProducto"));
                obj.setStockProducto(rs.getInt("stockProducto"));
                obj.setMotivoProducto(rs.getString("motivoProducto"));
                obj.getObjTipoProducto().setNombreTipo(rs.getString("nombreTipo"));
                obj.getObjTipoProducto().getObjCategoria().setNombreCategoria(rs.getString("nombreCategoria"));
       
                arreglo.add(obj);
                
                }while (rs.next());
            }
        rs.close();
        st.close();
        conexion.close();
             
         }
         catch(Exception error){
             System.out.println("Error en el metodo por: "+ error.getMessage());
                                 error.printStackTrace();
    
}
    return arreglo;
     }
     
     //actualizar
     public static boolean actualizarProducto (Producto a)
    {
        boolean estado = false ;
        Connection conexion=null;
         try{
             conexion=ControladorBD.darConexionBD();
             CallableStatement st=conexion.prepareCall(" {call sp_actualizarProducto "
                     +"(?,?,?,?,?,?,?,?,?)} ");
             st.setString(1,a.getCodigoProducto());
             st.setString(2,a.getNombreProducto());
             st.setString(3,a.getDescripcionProducto());
             st.setDouble(4,a.getPrecioSolesProducto());
             st.setInt(5,a.getNuevoStockProducto());
             st.setString(6,a.getMotivoProducto());  
             st.setString(7,a.getEstadoProducto());
             st.setString(8,a.getObjTipoProducto().getCodigoTipo());  
             st.registerOutParameter(9,java.sql.Types.BOOLEAN);
             st.execute();
             a.setRetorno(st.getBoolean(9));
             if(a.isRetorno()==true)
             {
                 estado=true;
             }
        st.close();
        conexion.close();
             
         } catch(Exception error){
             System.out.println("Error en el metodo por: "+ error.getMessage());
                                 error.printStackTrace();
         }
         
        return estado;  
        
    }
     
     
     /*
      * combo Slect Item que carga el tipo de producto
      */
    
     /*public static ArrayList<SelectItem> getCargarComboTipoProducto(Producto prod){         
    ArrayList<SelectItem> arrayNivel = new ArrayList<SelectItem>();
    Connection conexion = null;
    ResultSet rs = null;
    try{
    conexion = ControladorBD.darConexionBD();
    CallableStatement st = conexion.prepareCall( "{CALL sp_listarTipoProductoxCategoria(?)}");
     st.setString(1,prod.getObjTipoProducto().getObjCategoria().getNombreCategoria() );
    rs = st.executeQuery();        
    if (rs.next()){    
      do{
        arrayNivel.add(new SelectItem(rs.getString("codigoTipo"), 
                rs.getString("nombreTipo")));              
      } while (rs.next());
    }  
         rs.close();
         st.close();
         conexion.close();

     }catch(Exception error){
        System.out.println("Error en el metodo por: " +
                   error.getMessage());
                error.printStackTrace();
        }    
      
    return arrayNivel;
    }*/
     
     public static List<Producto> getCargarComboTipoProducto(Producto prod){   
    List<Producto> arr=null;            
    ResultSet rs=null;
        Producto obj=null;
        Connection conexion = null;
        try{
            conexion = ControladorBD.darConexionBD();
            CallableStatement st = conexion.prepareCall("{call sp_listarTipoProductoxCategoria(?)}");            
            st.setString(1, prod.getObjTipoProducto().getObjCategoria().getNombreCategoria());
            rs = st.executeQuery();
            if (rs.next()){               
                arr= new ArrayList<Producto>();
                do{
                    
                    obj =new Producto();
                    obj.getObjTipoProducto().setCodigoTipo("codigoTipo");
                    obj.getObjTipoProducto().setNombreTipo("nombreTipo");
                    arr.add(obj);
               } while (rs.next());
            }  
                 rs.close();
                 st.close();
                 conexion.close();


        }catch(Exception error){
                System.out.println("Error en el metodo por: " + error.getMessage());
                error.printStackTrace();
        }
    
    return arr;                
    }
}
